﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
public partial   class Rendicion
    {


    public decimal totalSaldo
    {
        get
        {
            return this.saldoAnterior + this.totalDeposito - this.toalIngreso;
        }
    }

    public void  SetAdd(dbGestionDataContext _db,
                    int? idRendicionAnt,
                    string numDocumento,
                    string descripcion,
                    int idEstado,
                    int idObra,
                    int idCaja,
                    short itemRendicion,
                    decimal saldoAnterior,
                    int idEmpleadoCre
        )
    {
        this.numDocumento = numDocumento;
        this.descripcion=descripcion;
        this.idEstado = idEstado;
        this.idObra=idObra;
        this.idCaja=idCaja;
        this.itemRendicion=itemRendicion;
        this.saldoAnterior = saldoAnterior;
        this.totalDeposito = 0;
        this.totalDeposito = 0;
        this.fechaCre = DateTime.Now;
        this.fechaMod = DateTime.Now;
        this.idEmpleadoCre=idEmpleadoCre;
        this.idEmpleadoMod=idEmpleadoCre;
       
        _db.Rendicions.InsertOnSubmit(this);
    }
    public short GetUltimoItemRendicion(dbGestionDataContext _db,int idCaja)
    {
        short itemMax = 0;
        if (_db.Rendicions.Where(p => p.idCaja == idCaja).Count() > 0)
        {
            itemMax = _db.Rendicions.Where(p => p.idCaja == idCaja).Max(p => p.itemRendicion);
        }
       
        return itemMax;

    }

    public void SetUpdate(
                    string descripcion,
                    int idUsuarioMod)
    {
        
        this.descripcion = descripcion;
        
    }


    public string getCorrelativo(dbGestionDataContext _db, int idCaja)
    {
        string numDocumento = "";

        

        var q = from a in _db.Rendicions
                where a.idCaja == idCaja
                group a by a.idCaja into g
                select new
                {
                    idObra = g.Key,
                    numDocumento = g.Max(p => p.numDocumento)
                };




        if (q.Count() == 0)
        {
            numDocumento = "000001";
        }
        else
        {
            int numActual = int.Parse(q.First().numDocumento);
            numActual++;


            if (numActual < 10)
            {
                numDocumento = "00000" + numActual.ToString();
            }
            else if (numActual < 100)
            {
                numDocumento = "0000" + numActual.ToString();
            }
            else if (numActual < 1000)
            {
                numDocumento = "000" + numActual.ToString();
            }
            else if (numActual < 10000)
            {
                numDocumento = "00" + numActual.ToString();
            }
            else if (numActual < 100000)
            {
                numDocumento = "0" + numActual.ToString();
            }
            else if (numActual < 1000000)
            {
                numDocumento = numActual.ToString();
            }
            else if (numActual > 1000000)
            {
                throw new Exception("Limite  de Correlativo Comparativo");
            }


        }
        return numDocumento;

    }

    public int getidAnterior(dbGestionDataContext _db,int idinternal, int idCaja)
    {
        int intAnterior = 0;


        var id = from i in _db.Rendicions
                 where i.idInternal < idinternal && i.idCaja == idCaja
                 group i by i.idCaja into g
                 select new
                 {
                     idAnterior = g.Max(p => p.idInternal)
                 };

        if (id.Count() > 0)
        {
            intAnterior = id.First().idAnterior;

        }
        else
        {
            throw new Exception("No existe Registros");
        }


        return intAnterior;

    }

    public int getidSiguiente(dbGestionDataContext _db, int idinternal, int idCaja)
    {
        int intSiguiente = 0;

        //revisar la sentencia generada
        var id = from i in _db.Rendicions
                 where i.idInternal > idinternal && i.idCaja == idCaja
                 group i by i.idCaja into g
                 select new
                 {
                     idSiguiente = g.Min(p => p.idInternal)
                 };


        if (id.Count() > 0)
        {
            intSiguiente = id.First().idSiguiente;

        }
        else
        {
            throw new Exception("No existe Registros");
        }

        return intSiguiente;
    }
    

    public void updateAutorizacion(dbGestionDataContext _db,
                           int idEmpleadoAprob,
                           string empleadoAprob,
                           string firmaAprob
                          )
    {
        this.idEstado = 41; //cerrado
        this.idAprobacion = idEmpleadoAprob;
        this.aprobador = empleadoAprob;
        this.firmaAprobador = firmaAprob;
        this.fechaAprobacion = DateTime.Now;
        _db.SubmitChanges();
    }

    public void updateDesAutorizacion(dbGestionDataContext _db
                                                  )
    {
        this.idEstado = 39; //Abierto
        this.idAprobacion = null;
        this.aprobador = null;
        this.firmaAprobador = null;
        this.fechaAprobacion = null;
        _db.SubmitChanges();
    }




    public void updateRevisado(dbGestionDataContext _db,
                          int idEmpleadoRevisor,
                          string empleadoRevisor,
                          string firmaRevisor
                         )
    {
        this.idEstado = 40; //cerrado
        this.idRevisado = idEmpleadoRevisor;
        this.revisado = empleadoRevisor;
        this.firmaRevisado = firmaRevisor;
        this.fechaRevisado = DateTime.Now;
        _db.SubmitChanges();
    }

    public void updateDesRevisado(dbGestionDataContext _db
                                                  )
    {
        this.idEstado = 39; //cerrado
        this.idRevisado = null;
        this.revisado = null;
        this.firmaRevisado = null;
        this.fechaRevisado = null;
        _db.SubmitChanges();
    }

    public void updateTotal(dbGestionDataContext _db)
    {
        var q= from a in _db.RendicionItems
               where a.idRendicion==this.idInternal
               select a;
        var d= from a in _db.RendicionDepositos
               where a.idRendicion==this.idInternal
               select a;

        this.toalIngreso = 0;
        this.totalDeposito = 0;

        if (q.Count()>0)
            this.toalIngreso = q.Sum(p => p.total);

        if (d.Count()>0)
            this.totalDeposito=d.Sum(p=>p.total);
        
    }

    }
}
